//自己封装react       :主要是一个createElement函数

//factory method   return a object
/*
function ReactElement(type, props) {
    const element = {
        $$typeof: REACT_ELEMENT_TYPE,
        type,
        props
    };
    return element
}*/


const hasSymbol = typeof Symbol === 'function' && Symbol.for();

//所有React元素为类的父类（均需要继承）
class Component {
    constructor(props) {
        this.props = props;
    }

    static isReactComponent = true;
}


export const REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;


function createElement(type, config, children) {
    //把config上的所有属性都拷贝到props上，
    let props = {};
    for (let key in config) {
        props[key] = config[key];
    }

    const childrenLength = arguments.length - 2;

    if (childrenLength === 1) {
        props.children = children;   //如果只有一个children，那么props.children是一个对象，也就是一个ReactNode
    } else if (childrenLength > 1) {
        //如果大于一个children，就把所有的children放到一个数组里面，arguments一共有三个参数，从索引 = 2的children元素开始一直截取到最后
        props.children = Array.prototype.slice.call(arguments, 2)
    }

    //表示这是一个React元素类型（唯一标识）
    return {type, props, $$typeof: REACT_ELEMENT_TYPE}

    /*
    *   REACT_ELEMENT_TYPE：表示这是一个React元素
    *   type：React类型，可能是String，number，function,class   virtual dom
    *
    * */

}


export default {
    createElement,
    Component
}
